package org.example.maven.utils.Date;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import io.micrometer.common.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class IsWeekend {
    //节假日url
    public static String SYNC_ADDRESS = "https://timor.tech/api/holiday/year/";
    //假期
    static Map<String, List<String>> holiday = new HashMap<>();
    // 新增：记录是否已经获取过某年的节假日数据
    static Map<String, Boolean> fetchedYears = new HashMap<>();
    //调休日
    static Map<String, List<String>> extraWorkDay = new HashMap<>();
    static {
        holiday = new HashMap<>();
        extraWorkDay = new HashMap<>();
    }

    /**
     * @param date 日期参数 格式‘yyyy’，不传参则默认当前日期
     * @return 自己定义，我这里作为案例使用的是yes和no
     */
    public static String getYearHoliday(String date) throws ParseException {
        if (fetchedYears.getOrDefault(date, false)) {
            return "Yes!";
        }

        try {
            String result = HttpUtils.sendGet(SYNC_ADDRESS + date);
            cn.hutool.json.JSONObject json = JSONUtil.parseObj(result);
            cn.hutool.json.JSONObject holidayJson = json.getJSONObject("holiday");

            if (holidayJson.size() == 0) {
                return "No!";
            }

            List<String> hoList = new ArrayList<>();
            List<String> extraList = new ArrayList<>();

            Iterator<Map.Entry<String, Object>> iterator = holidayJson.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, Object> entry = iterator.next();
                String value = entry.getValue().toString();
                JSONObject jsonObject = JSONUtil.parseObj(value);

                String hoBool = jsonObject.getStr("holiday");
                String extra = jsonObject.getStr("date");

                if ("true".equals(hoBool)) {
                    hoList.add(extra);
                } else {
                    extraList.add(extra);
                }
            }

            // 统一更新，避免遍历时修改 map
            holiday.put(date, hoList);
            extraWorkDay.put(date, extraList);
            fetchedYears.put(date, true);

        } catch (Exception e) {
            e.printStackTrace();
            return "No!";
        }
        return "Yes!";
    }


    //判断日期类型：0：工作日，1.周末，2.法定节假日
    /**
     * @param time 日期参数 格式‘yyyy-MM-dd’，不传参则默认当前日期
     * @return String 0：工作日，1.周末，2.法定节假日
     */
    public static String isWorkingDay(String time) throws ParseException {
        Date parse = null;
        //为空则返回当前时间
        if (StringUtils.isNotBlank(time)) {
            SimpleDateFormat getYearFormat = new SimpleDateFormat("yyyy-MM-dd");
            parse = getYearFormat.parse(time);
        } else {
            parse = new Date();
        }
        String newDate = new SimpleDateFormat("yyyy").format(parse);

        //判断key是否有参数年份
        //考虑年底需要获取跨年后的数据，所以要获取下一年的所有节假日情况
        if (!holiday.containsKey(newDate)) {
            String holiday = getYearHoliday(newDate);
            getYearHoliday(String.valueOf(Integer.parseInt(newDate) + 1));
            if ("No!".equals(holiday)) {
                return "该年份未分配日期安排！";
            }
        }

        //得到日期是星期几
        Date date = DateUtil.parseDate(time);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int weekday = DateUtil.dayOfWeek(calendar.getTime());


        //是否节假日
        if (holiday.get(newDate).contains(time)) {
            return "2";//法定节假日
        } else if (extraWorkDay.get(newDate).contains(time)) {
            return "0";//工作日
        } else if (weekday == Calendar.SATURDAY || weekday == Calendar.SUNDAY) {
            return "1";//周末
        } else {
            return "0";//工作日
        }
    }



}
